其他
华为云基于Apache Hudi实时数据湖的查询优化
导读 本文将介绍华为云在实时数据湖查询方面的优化以及一些建议。主要内容包括四大部分:
1. 华为云数据湖介绍
2. Hudi查询能力介绍
3. 华为云基于Hudi的性能优化
4. 未来规划
分享嘉宾|孟涛 华为 高级工程师
编辑整理|唐洪超 hotata
出品社区|DataFun
01
华为云数据湖介绍
首先对华为云数据湖进行一下简要的介绍。
02
Hudi查询能力介绍这一部分介绍Hudi开源社区已经具备的一些查询能力。
1. Hudi介绍Hudi提供流式挖掘、增量查询,以及丰富的仓的能力,比如高效的更新删除能力,可插拔的索引。还有关系型数据库常见的事务、MVCC、并发管理以及 schema evolution和time travel等能力。Hudi还可以帮我们去解决一些比较麻烦的小文件合并的问题。并且提供了clustering 等一系列功能去使数据的布局更加紧凑,从而提升查询效率。Hudi还有着丰富的生态支持,支持Flink/Spark 写入,以及Presto、Hive、Spark、Flink以及Doris的查询。可见Hudi具备丰富的流处理能力和仓的能力。所以我们选择了Hudi作为实时数仓的基础。
2. Clustering
3.MDT
03
华为云基于Hudi的性能优化
这一章节将介绍华为云基于开源Hudi所做的性能优化。1. Hudi索引优化索引是为了加快检索速度而创建的一种存储结构,是一种空间换时间的设计思想,作用可以理解为书的目录,通过目录我们可以快速检索到需要的内容。常见的索引类型有数据索引、二级索引、前缀索引等。数据索引,比如对数据做分区,或者是sort、z-order等,这些操作不会产生额外的存储信息,不会产生索引文件。但是由于做了排序或者分区,可以去做分区裁剪,或者是文件级别的FileSkipping,从而提升查询效率。Lucene和bitmap 这种二级索引对数据排序是没要求的,可以在任意表上去构建。但它们是典型的空间换时间的思想,会产生比较大的索引,在查询的时候由查询引擎去加载这些索引,再去做相应的文件裁剪。不同索引都有各自的优缺点,引入这些索引可以提升查询效果。但并不是某一种索引就可以适用各种场景,不同索引适用于不同的场景。接下来将具体介绍数据索引Min-max、Lucene索引和Bitmap索引,并对比各种索引的优缺点,给出使用建议。2. 基于MDT的Min-max索引第一点,lucene不能根据全表去构建,前文提到是根据行号去构建的,但实际在真正构建的过程中,不能拿全表去做构建。而是应该按文件级别,选择每个文件自己的行号作为它的 Doc ID,生成文件级别的lucene索引。全表级别生成行号是不现实的,因为表数据在持续地写入,之前的行号就会发生变化。第二点,lucene索引构建是一个比较耗时的任务,我们选用异步构建的方式,异步构建需要防止构建任务阻塞入库流程。当然,天级别大任务可以选择同步构建。Lucene 并不是完美的,第一个缺陷就是会生成很多小文件,如上图所示,每个文件构建lucene索引的时候,都会产生13 个文件,也就意味着文件数量膨胀了 13 倍。这对HDFS是不可接受的,小表还能这样做,大表的话HDFS基本就被打爆了。第二个缺陷是,lucene对 string 类型可以做分词,string 越长,产生的分词数就越多,这样产生的索引文件就会很大,甚至构建出来的 lucene索引文件比整个表都大。对于数值类型,它的lucene索引文件比较小,可以直接放在内存中,加快查询。综上所述,这就是lucene,它很好但并不完美,在实际应用中需要配合一些解决方案。后文中会介绍我们是如何解决这个问题的。
4. bitmap
5. 各种索引对比和使用建议
04
未来规划
最后,简要介绍一下后续工作。第一点还是一些缓存的问题,我们要考虑怎么去缓存热点数据文件,而不仅仅是缓存索引。第二点我们要去构建实时物化视图,动态收集用户的查询条件,入库时实时构建物化视图。第三点,我们会尝试去优化一下 Mor表的读性能。可能会参考 DeltaLake中一个比较新颖的方式叫delete vectors,平衡Hudi读写开销。因为当前的Mor表索引是没法直接用上的,即使Min-max化索引对它也是无效的,因为log基本是无序的。以上就是本次分享的内容,谢谢大家。推荐阅读华为基于Hudi构建的实时数据湖架构与实践Apache Hudi 1.x 版本重磅功能展望与讨论
Zoom 基于Apache Hudi 的流式日志处理实践
提升 Apache Hudi Upsert 性能的三个建议
日增数据超10PB!揭秘沃尔玛Lakehouse架构选型之路